#ifndef __M_HOT_H__
#define __M_HOT_H__

#include "Util.hpp"
#include "config.hpp"
#include "data.hpp"

/*
    热点文件管理模块
*/

extern std::unordered_map<std::string,std::shared_ptr<cloud::DataManager>> _Data;

namespace cloud
{
    class hot
    {
    private:
        std::string _back_dictory;//备份文件所在目录
        std::string _pack_dictory;//压缩文件所在目录
        std::string _pack_suffix;
        int _host_time;//热点限制时间
    public:
        hot()
        {
            _back_dictory = config::GetInstance()->GetBackDictory();
            _pack_dictory = config::GetInstance()->GetPackDictory();
            _pack_suffix = config::GetInstance()->GetPackSuffix();
            _host_time = config::GetInstance()->GetHostTime();
        }

        //非热点文件返回真,热点文件返回假
        bool IsHostFile(const std::string& filename)//判断是否是热点文件
        {
            FileUtil file(filename);
            time_t LastAtime = file.FileLastATime();
            time_t CurTime = time(nullptr);
            if(CurTime - LastAtime > _host_time)//超过规定的时间内没有被下载,判断为热点文件
            {
                return true;               
            }
            return false;
        }

        bool RunModule()
        {
            while(1)
            {
                for(auto data : _Data)
                {
                    //1.获取备份目录下的所有文件
                    FileUtil file(_back_dictory + data.first + "/");//备份目录加上邮箱
                    std::vector<std::string> _array;
                    file.ScanDictory(&_array);

                    //2.遍历判断是不是热点文件
                    for(auto e : _array)
                    {
                        if(IsHostFile(e) == false)//是热点文件,不需要处理
                        {
                            continue;
                        }
                        //3.获取文件备份信息
                        backupInfo info;
                        if(data.second->GetOneByRealPath(e,&info) == false)//如果不存在文件的备份信息.就进行创建
                        {
                            std::string Email = data.first;
                            User user;
                            UserManager::GetInstance()->Find(Email,&user);
                            info.NewBackupInfo(e,user._name);
                        }
                        //4.对非热点文件进行压缩
                        FileUtil tmp(e);
                        tmp.compress(info._pack_path);
                        info._pack_flag = true;
                        //5.删除原文件
                        tmp.Remove();
                        //6.更新备份文件
                        data.second->Update(info);
                    }
                }
            }
            return true;
        }
    };
}


#endif

